package baduga.core;


/**
 * @author Janek
 *
 */
public class Core_Messages {
	
	private static Database_Messages dMsg;
	/** */
	private static boolean status = false;
	
	/**
	 * 0 - Niezgodna ilość argumentów
	 * 1 - Brak żądanego komunikatu
	 */
	private static int internalErrorCode[] = new int[] {0xFFFC, 0xFFFE, 0xFFFF};
	
	/**
	 * Inicjalizuje połączenie z bazą komunikatów
	 * Jeśli załaduje się Database_Messages to ustawia status na true.
	 */
	public static void init()
	{
		Core_Messages.dMsg = new Database_Messages();
		Core_Messages.status = true;
	}
	
	/**
	 * Klasa zajmuje się przetwarzaniem ciągów znakowych
	 * W przypadku problemu rzuca wyjątkiem
	 * 
	 * @param msgData {Ciąg znakowy, z pustymi miejscami do wstawienia stringów}
	 * @param msgCode {Kody komunikatów}
	 * @return
	 */
	
	//TODO: Dodać exception 
	public static String parseMessage(String msgData, final int[] msgCode) throws Core_Exception
	{
		if(Core_Messages.isActive())
		{
			//Zmienne pomocnicze
			String[] tmp = msgData.split(",");
			String tmp2;
			
			msgData = "";
			
			int w = 0; //Licznik
			
			for(int i = 0; i < tmp.length; i++)
			{
				//Jeśli pusty ciag znakowy to zastąp go komunikatem
				if(tmp[i].equals(""))
				{
					tmp2 = Core_Messages.getMessage(msgCode[w]);
					//Zwiększ licznik dla komunikatów
					++w;
					
					//Obsługa wyjątku, gdy nie istnieje komunikat
					if(tmp2 == null)
					{
						throw new Core_Exception(Core_Messages.dMsg.getMessage( internalErrorCode[1]) + Integer.toString(msgCode[w]));
					}
					//Obsługa wyjątku, gdy nie ma już komunikatów do pustych miejsc.
					else if(w == msgCode.length)
					{
						throw new Core_Exception(Core_Messages.dMsg.getMessage( internalErrorCode[0] ));
					}
						
					
					
					msgData += tmp2;
					
					
				}
				else
					msgData += tmp[i];
					
					
			}
		}
		else
			msgData = "";
		
		return msgData;
	}
	


	/**
	 * Zwraca komunikat o podaniu M_Code. W przypadku nie powodzenia wyrzuca wyjątek.
	 * 
	 * @param M_Code
	 * @return
	 */
	
	public static String getMessage(final int mCode) throws Core_Exception
	{
		String tmp;
		
		if(Core_Messages.isActive())
		{
			tmp = Core_Messages.dMsg.getMessage(mCode);
			
			if(tmp == null)
			{	//TODO: Zastanowić się ew. co dalej
				throw new Core_Exception( Core_Messages.dMsg.getMessage(internalErrorCode[0]) + Integer.toString(mCode) );
			}
		}
		else
			tmp = "";
		
		return tmp;
	}
	
	/**
	 * Sprawdza czy  komunikat o kodzie M_Code istnieje
	 * 
	 * @param M_Code
	 * @return
	 */
	public static boolean isExistMessage(int mCode)
	{
		if(Core_Messages.isActive())
			return Core_Messages.dMsg.isExistMessage(mCode);
		else
			return false;
	}
	
	/**
	 * Zwraca informacje czy podpięta jest baza danych komunikatów
	 * 
	 * @return
	 */
	public static boolean isActive()
	{
		return Core_Messages.status;
	}
	
	

}
